#ifndef MYSQL_TEST_MYSQL_UTILS_H
#define MYSQL_TEST_MYSQL_UTILS_H

#include <cstring>
#include <vector>
#include <mysql.h>
#include <cstdio>
#include <string>

const bool static debug = true;

class sql_utils {
public:
    /**
     * 初始化构造函数
     * @param date_base 要调用的数据库
     * @param host 主机, 默认为localhost
     * @param user 用户, 默认root
     * @param passwd 密码, 默认123456
     * @param port 端口号, 默认3306
     */
    explicit sql_utils(const std::string & date_base,
                       const std::string & host = "localhost",
                       const int port = 3306,
                       const std::string & user = "root",
                       const std::string & passwd = "123456");
    // 这里要防止隐式构造

    ~sql_utils();

    /**
     * 用于判断连接是否成功的函数
     * @return 返回连接是否成功
     */
    bool is_connection() const;

    /**
     * 查询用方法, 查询对应的sql, 返回查询的结果集
     * @param sql
     * @return
     */
    std::vector<std::vector<std::string> > select(const std::string &sql);

    /**
     * 增加, 删除, 修改操作
     * @param sql 调用的sql语句
     * @return 返回修改的成功与否
     */
    bool query(const std::string & sql);

private:
    bool connection_flag;
    // 用于判断连接是否成功的
    MYSQL * mysql_sock;
    /**
     * 初始化mysql
     * @param date_base 要调用的数据库
     * @param host 主机, 默认为localhost
     * @param user 用户, 默认root
     * @param passwd 密码, 默认123456
     * @param port 端口号, 默认3306
     */
    bool connect_mysql(const std::string & host,
                       const int port,
                       const std::string & user,
                       const std::string & passwd,
                       const std::string & date_base);

    /**
     * 释放mysql连接
     */
    void free_connect();
};

#endif //MYSQL_TEST_MYSQL_UTILS_H
